![]() |
![]() |
|
27.3.4 Die Editoren eines Weitergabeprojekts
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Dateisystem-Editor In diesem Editor werden die weiterzugebenden Dateien angegeben sowie die Ordner auf dem Zielrechner, in denen die Dateien installiert werden. |
| Registrierungs-Editor In diesem Editor lassen sich Registrierungsschlüssel und Registrierungswerte angeben, die in der Registrierungsdatenbank auf dem Zielrechner eingetragen werden. Schon beim ersten Start nach einer erfolgreichen Installation kann ein Programm direkt gültige Werte abfragen. |
| Dateityp-Editor Mit dem Dateityp-Editor können Dateizuordnungen auf dem Zielcomputer eingerichtet werden, die eine bestimmte Dateierweiterung mit der Anwendung verknüpfen. Darüber hinaus werden die für den Dateityp zulässigen Aktionen festgelegt. |
| Benutzeroberflächen-Editor Mit diesem Editor können Sie zusätzliche Dialoge bestimmen, die während des Installationsvorgangs angezeigt werden. Dieser Editor bietet die größte Einflussnahme auf den Installationsprozess. |
| Editor für benutzerdefinierte Aktionen Hiermit lassen sich benutzerdefinierte Aktionen definieren, die während der Installationsphase auf dem Zielrechner ausgeführt werden. Damit können beispielsweise Operationen festgelegt werden, die nur dann ausgeführt werden, wenn während der Installation ein Fehler auftritt oder wenn die Anwendung später deinstalliert werden soll. |
| Editor für Startbedingungen Die Lauffähigkeit mancher Anwendungen ist davon abhängig, dass bestimmte Dateien auf dem Zielcomputer installiert sind. Deren Existenz muss daher vor Beginn des eigentlichen Installationsprozesses geprüft werden. Ist das Suchergebnis negativ, lassen sich mit diesem Editor Aktionen festlegen, um die erforderlichen Dateien vor Beginn der Programminstallation zu installieren. Ein ganz typischer Fall ist, dass die Lauffähigkeit eines .NET-Programms von der Installation des .NET Frameworks abhängt. Ist das Framework noch nicht installiert, muss der Benutzer das noch nachholen. |
| Eigenschaften Dieses ganz links stehende Symbol im Projektmappen-Explorer öffnet keinen Editor, sondern ein Dialogfenster, in dem sich allgemeine Verteilungsbedingungen festlegen lassen. |
| Alle aufgeführten Editoren stehen gleichermaßen sowohl für ein Weitergabeprojekt, das mit dem Setup-Assistenten gestartet wird, als auch für ein Weitergabeprojekt vom Typ Setup-Projekt zur Verfügung. |
Der Dateisystem-Editor wird nach dem Beenden des Setup-Assistenten angezeigt oder direkt, wenn ein neues Setup-Projekt angelegt wird. Der Editor dient als Container aller Dateien und Verknüpfungen, die auf dem Zielrechner installiert beziehungsweise eingerichtet werden müssen. Darüber hinaus enthält er auch alle Dateien, die vom Installationsprogramm benötigt werden, beispielsweise die Symboldateien.
Kennzeichnend für den Dateisystem-Editor ist der zweigeteilte Anzeigebereich. Im linken Teilfenster sind Ordner aufgelistet. Diese entsprechen den Standardordnern von Windows, von denen drei sofort angegeben werden:
| Anwendungsordner |
| Desktop des Benutzers |
| Programmmenü des Benutzers |
Öffnen Sie das Kontextmenü des übergeordneten Knotens Dateisystem auf Zielordner, werden noch viele zusätzliche Ordner angeboten, z.B. Windows-Ordner, System-Ordner oder Cacheordner für globale Assembly. Wenn Sie wollen, können Sie sogar eigene Ordner definieren, so dass Ihnen keine Grenzen gesetzt sind.
Markieren Sie einen Ordnerknoten, werden im Eigenschaftsfenster dessen Eigenschaften angezeigt. Die folgende Tabelle 27.5 listet die wichtigsten Eigenschaften auf.
| Eigenschaft | Beschreibung |
| AlwaysCreate | Mit dieser Eigenschaft wird ein boolescher Wert festgelegt, der den Installationsprozess anweist, wann ein Ordner anzulegen ist. Ist der Wert true, wird der Ordner auch dann angelegt, wenn er keine Dateien enthält. |
| Condition | Mit dieser Eigenschaft wird eine bestimmte Bedingung festgelegt, die erfüllt sein muss, damit das Element, in diesem Fall der Ordner, installiert wird. |
| DefaultLocation | Diese Eigenschaft beschreibt den Standardspeicherort, an dem ein Ordner auf dem Zielcomputer installiert wird. Der Wert kann beliebig verändert werden. |
| Transitive | Diese Eigenschaft legt fest, wie die Eigenschaft Condition des Elements ausgewertet wird. Ist Transitive=true gesetzt, wird bei jeder Installation der Anwendung die Condition-Eigenschaft ausgewertet, andernfalls nur bei der ersten Installation. |
Sehen wir uns den Eintrag der Eigenschaft DefaultLocation an, finden wir die Angabe:
| [ProgramFilesFolder][Manufacturer]\[ProductName] |
Ist der eingetragene Firmenname »Tollsoft« und der Produktname »MyFirstApp«, werden üblicherweise alle Dateien, die diesem Ordner zugeordnet sind, unter
C:\Programme\Tollsoft\MyFirstApp
gespeichert. Als Produktname wird der Bezeichner des Setup-Projekts übernommen. Sie können sowohl den Produktnamen als auch den Firmenbezeichner, der von der Installation des Visual Studios 2005 übernommen wird, beliebig einstellen. Markieren Sie dazu im Projektmappen-Explorer der Entwicklungsumgebung den Knoten des Setup-Projekts und öffnen dessen Eigenschaftsfenster. Hier stellen Sie die Eigenschaft Manufacturer und ProductName wie gewünscht ein.
| Hinweis Die meisten anderen Eigenschaftseinstellungen des Setup-Projekts werden ausgewertet, wenn im Windows-Explorer der Dialog Eigenschaften der msi-Datei geöffnet wird. Weitere Informationen entnehmen Sie bitte der .NET-Dokumentation. |
Die während der Installation vorgeschlagene Speicherlokalität für die Anwendungsdateien kann beliebig unter DefaultLocation eingestellt werden. Beispielsweise wird das Installationsprogramm mit der Voreinstellung
| [ProgramFilesFolder]\[ProductName] |
den Vorschlag machen, die Anwendung in einem Verzeichnis zu installieren, das dem Namen des Produkts entspricht und Programme direkt untergeordnet ist. Sie können sogar einen x-beliebigen Verzeichnisnamen vorschlagen, der keine Entsprechung durch ein Attribut finden, z.B.:
| [ProgramFilesFolder]\HierhinInstallieren |
ProgramFilesFolder, ProductName und Manufacturer sind Eigenschaften des Windows Installers, von denen der Installer eine unüberschaubar große Menge für die unterschiedlichsten Zwecke anbietet. Hier alle aufzuführen, würde viele Seiten des Buchs in Anspruch nehmen. Wenn Sie weitere Informationen benötigen, finden Sie diese in der MSDN-Library unter dem Stichwort Windows Installer unter Properties (leider ist die Hilfe des Windows Installers nur in Englisch verfügbar).
Nichtsdestotrotz werden in der folgenden Tabelle die im Zusammenhang mit der Dateiinstallation wichtigsten Eigenschaften aufgeführt, um Ihnen zumindest in diesem Punkt die Arbeit etwas zu erleichtern.
| Eigenschaft | Beschreibung |
| AppDataFolder | Liefert den Pfad zu Anwendungsdaten des aktuellen Benutzers. |
| CommonAppDataFolder | Liefert den Pfad zu Anwendungsdaten für alle Benutzer. |
| CommonFilesFolder | Liefert den Pfad zu \Programme\Gemeinsame Dateien des aktuellen Benutzers. |
| DesktopFolder | Liefert den Pfad zum Desktop-Verzeichnis. |
| FavoritesFolder | Liefert den Pfad zu Favoriten des aktuellen Benutzers. |
| MyPicturesFolder | Liefert den Pfad zu Eigene Bilder des aktuellen Benutzers. |
| ProgramFilesFolder | Liefert den Pfad zu Programme. |
| SendToFolder | Liefert den Pfad zu SendTo des aktuellen Benutzers. |
| StartMenuFolder | Liefert den Pfad zu Startmenü des aktuellen Benutzers. |
| SystemFolder | Liefert den Pfad zu Sytem32. |
| TempFolder | Liefert den Pfad zu Temp. |
| TemplateFolder | Liefert den Pfad zu Vorlagen des aktuellen Benutzers. |
| WindowsFolder | Liefert den Pfad zu Winnt. |
Haben Sie den Setup-Assistenten benutzt, brauchen Sie sich eigentlich nicht weiter um das Hinzufügen der zu installierenden Dateien zu kümmern. Ihnen ist zumindest ein Teil der Arbeit abgenommen worden. Sollten Sie sich allerdings für Setup-Projekt entschieden haben, kommt jetzt die wichtige Aufgabe, alle notwendigen Dateien einzubinden. Markieren Sie dazu im Dateisystem-Editor den Eintrag Anwendungsordner und öffnen das dazugehörige Kontextmenü. Unter dem Menüpunkt Hinzufügen werden in einem Untermenü Ordner, Projektausgabe, Datei und Assembly angeboten. Wählen Sie aus der Liste Datei aus, und navigieren Sie anschließend im Auswahldialog zu der EXE-Datei der Anwendung.
Die Entwicklungsumgebung fügt nicht nur die ausgewählte Programmdatei in das Weitergabeprojekt ein, sondern erkennt darüber hinaus auch alle Abhängigkeiten, sowohl die Abhängigkeit vom .NET Framework als auch die Abhängigkeit von benutzerdefinierten Bibliotheken (DLL-Dateien), die automatisch in das Projekt einbezogen werden.
Ausgesprochen problematisch ist es, im Programmcode eine Pfadangabe zu machen, die sich auf das lokale Dateisystem des Entwicklungsrechners bezieht. Dabei kann es sich um Bilder, eine Datenbankdatei oder auch ganz einfache Datendateien handeln. Angenommen, zur Laufzeit einer Anwendung soll in einer Picturebox eine Bitmap angezeigt werden. Die Anweisung zum Laden der Bitmap könnte wie folgt codiert sein:
| pictureBox1.Image = Image.FromFile(@"C:\Bitmap1.bmp"); |
Beim Testen der Anwendung wird die Anweisung keinen Fehler verursachen – vorausgesetzt natürlich, dass die Grafikdatei auch unter der codierten Pfadangabe zu finden ist. Nach der Installation der Anwendung auf dem Zielcomputer ist die Wahrscheinlichkeit aber gering, dass die Anweisung unter der Pfadangabe eine Datei mit diesem Namen finden wird. Die Folge ist ein Laufzeitfehler.
Wenn Sie davon ausgehen müssen, dass eine bestimmte Datei nicht auf dem Zielrechner in einem bestimmten Verzeichnis vorgefunden wird, müssen Sie die Datei in die Installationsroutine mit aufnehmen. Dazu eignet sich grundsätzlich jedes Verzeichnis, das auf dem Zielrechner identifiziert werden kann. Möchten Sie die Datei im Anwendungsordner verteilen, fügen Sie die Datei dem gleichnamigen Knoten im Dateisystem-Editor hinzu. Die Anweisung im Programmcode muss dann wie folgt lauten:
| pictureBox1.Image = Image.FromFile(@"Bitmap1.bmp"); |
Häufig werden zusätzliche Dateien auch in einem Unterordner des Programmordners abgelegt. Einen Unterordner anzulegen ist nicht schwierig. Markieren Sie dazu im Dateisystem-Editor nur den Ordner, der den Unterordner enthalten soll, und wählen im Kontextmenü Hinzufügen und dann Ordner aus. Anschließend müssen Sie nur noch einen aussagekräftigen Namen finden.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.14 Unterordner des Anwendungsordners
Unabhängig davon, ob von der Anwendung benötigte Dateien im Anwendungsverzeichnis oder in einem Unterverzeichnis von diesem installiert werden, müssen Sie das in der Anweisung, die auf die Datei zugreift, berücksichtigen. Damit stehen Sie aber auch vor einem entwicklungstechnischem Problem: Entweder Sie kopieren die Dateien auf dem Entwicklungsrechner in einen Pfad, der dem relativen Pfad auf dem Zielrechner entspricht, oder Sie passen alle Pfadangaben vor der endgültigen Kompilierung an die relativen Pfade der auf dem Zielrechner installierten Anwendung an.
Sie können sich Ärger und zumindest einen weiteren, ausgiebigen Testlauf ersparen, wenn Sie bei der Entwicklung der Anwendung dieser Situation von Anfang an Rechnung tragen. Dazu bietet es sich an, ein benutzerdefiniertes Attribut bereitzustellen, das den Pfad zu den Ressourcen beschreibt. Angenommen, Sie beabsichtigen, mit einer Anwendung Grafiken zu weiterzugeben. Während der Entwicklungsphase sei dieser Ordner ein Unterordner des Projektverzeichnisses. Wahrscheinlich werden Sie zu diesem Zeitpunkt auch noch keinen Gedanken daran verschwenden, in welchem Verzeichnis auf dem Zielrechner später die Grafikdateien zu finden sind bzw. wie der Ordner heißen wird.
Im benutzerdefinierten Attribut wird eine öffentliche Variable deklariert, die den Zugriffspfad zu dem Ordner der Grafikdateien beschreibt. Dabei gibt man am besten einen relativen Pfad bezogen auf die Programmdatei an. Das Attribut könnte dann gemäß der oben beschriebenen Annahme wie folgt definiert sein:
| [AttributeUsage(AttributeTargets.All)] |
| public class BitmapLocationAttribute : Attribute { |
| public string Loacation = "..\\..\\..\\Bilder\\"; |
| } |
Eine Form, aus deren Programmcode heraus auf eine Grafik im Ordner Bilder zugegriffen wird, muss mit dem Attribut BitmapLocationAttribute verknüpft werden. Man muss sich anschließend nur noch die Referenz auf das Attribut besorgen und kann dann dessen Eigenschaft Location auswerten, z.B.:
| [BitmapLocation] |
| public class Form1 : Form { |
| private void Form1_Load(object sender, EventArgs e) { |
| BitmapLocationAttribute attr = |
| (BitmapLocationAttribute)Attribute.GetCustomAttribute |
| (typeof(Form1),typeof(BitmapLocationAttribute)); |
| ... |
| pictureBox1.Image = Image.FromFile(Application.StartupPath |
| + attr.Loacation + "Bitmap1.bmp"); |
| } |
| } |
Den Pfad auf die Programmdatei liefert die statische Eigenschaft StartupPath der Klasse Application. Der Rückgabewert wird mit dem Inhalt der Eigenschaft Location des Attributs verknüpft. Damit ist die Pfadangabe beschrieben, und es fehlt nur noch der Dateiname. In diesem Codefragment ist es die Datei Bitmap1.bmp.
Der Vorteil, den Sie aus dem Attribut ziehen können, kommt besonders dann zum Tragen, wenn Sie öfters auf die Ressourcen des Ordners zugreifen. Beabsichtigen Sie, die Anwendung zu verteilen und den Ressourcenordner als Unterordner des Anwendungsverzeichnisses auf dem Zielrechner zu installieren, müssen Sie nur die Pfadangabe der Eigenschaft Location anpassen:
| [AttributeUsage(AttributeTargets.All)] |
| public class BitmapLocationAttribute : Attribute { |
| public string Loacation = "\\Bilder\\"; |
| } |
Damit erübrigt sich alles Weitere. Wenn zur Entwicklungszeit der Zugriff auf die Ressourcen fehlerfrei möglich war, wird ein kurzes Testen der Installation ausreichen, um die korrekte Pfadangabe im Attribut zu beweisen.
| Achtung Eine andere, vielleicht sogar noch einfachere Alternative ist es, schon bei der Entwicklung der Anwendung eine Anwendungskonfigurationsdatei vorzusehen und mit dem Weitergabeprojekt zu verteilen. |
Wenn Sie bis hierher gefolgt sind und auch schon einmal eine Anwendung mit dem Installationsassistenten installiert haben, werden Sie festgestellt haben, dass das Programm weder im Startmenü eingetragen worden ist noch eine Desktop-Verknüpfung den schnellen Start der Anwendung ermöglicht. Dieser Mangel soll nun behoben werden.
Im linken Teilfenster des Dateisystem-Editors werden bereits die dafür notwendigen Ordner angeboten. Sie müssen jeweils nur noch eine Verknüpfung zur Programmdatei einrichten. Dazu bieten sich zwei Wege an, die für beide Knoten identisch sind:
1. Markieren Sie den Knoten Desktop des Benutzers bzw. Programmmenü des Benutzers. Ziehen Sie dann die Maus in das rechte Teilfenster, öffnen das Kontextmenü und wählen Neue Verknüpfung erstellen. Es wird daraufhin ein Dialog angezeigt, in dem alle Knoten des Dateisystem-Editors aufgelistet sind. Doppelklicken Sie auf Anwendungsordner, und wählen Sie die Programmdatei aus (siehe Abbildung 27.15).| 2. | Sie können auch im aktiven Knoten Anwendungsordner das Kontextmenü der Programmdatei öffnen und den Menüpunkt Verknüpfung erstellen zu... ausführen. Die erzeugte Verknüpfung gehört jetzt zum Anwendungsordner und muss nur noch mit der Maus in den Ordner Desktop des Benutzers bzw. Programmmenü des Benutzers verschoben werden. Für jeden Ordner ist eine eigene Verknüpfung zu erstellen. |

Hier klicken, um das Bild zu vergrößern
Abbildung 27.15 Elementauswahldialog
Sie können die Einträge im Programmmenü auch in einem Untermenü zur Auswahl anbieten. Dazu müssen Sie den Ordner Programmmenü des Benutzers im Dateisystem-Editor nur um einen weiteren Ordner ergänzen, in dem Sie anschließend die Verknüpfung zu der Programmdatei eintragen. Auf diese Weise lassen sich beliebige Gliederungsebenen im Programmmenü realisieren. Häufig werden diese dazu benutzt, um dem Benutzer einen direkten Zugriff auf zusätzlich ausgelieferte Programme oder die Hilfe der Anwendung anzubieten. Ähnlich machen es auch das Visual Studio 2005 und viele andere Anwendungen.
Wenn Sie alle Verknüpfungen erstellt haben, sollten Sie keinesfalls vergessen, deren Namen neu festzulegen. Dazu bietet sich entweder das Kontextmenü des jeweiligen Eintrags an oder eine Änderung der Eigenschaft Name im Eigenschaftsfenster.
Auf dem Desktop wird ein Standardsymbol in der Größe 32 × 32 Pixel angezeigt, der Link im Programmmenü benutzt ein Standardsymbol in der Größe 16 × 16 Pixel. Sie können auch eigene Symbole (Dateierweiterung ICO) benutzen, um der Anzeige ein gefälligeres Aussehen zu verleihen. Dazu müssen die beiden Symboldateien vorliegen und in das Weitergabeprojekt eingebunden werden. Sinnvollerweise eignet sich dazu der Anwendungsordner, es darf aber auch ein beliebiger anderer sein.
Um einer Verknüpfung ein individuelles Symbol zuzuordnen, markieren Sie die Verknüpfung, klicken im Eigenschaftsfenster auf Icon, und wählen Sie aus der Drop-down-Liste die Option Durchsuchen aus. Daraufhin wird der Dialog Symbol angezeigt, in dem Sie zu der Symboldatei navigieren, die Sie vorher dem Dateisystem-Editor hinzugefügt haben.
Da die Symboldateien der Liste der zu verteilenden Dateien hinzugefügt worden sind, werden sie normalerweise auf dem Zielrechner installiert. Um das zu vermeiden, können Sie die Eigenschaft Exclude dieser Dateien auf false einstellen. Die Folge ist, dass die Dateien dann nicht installiert wird, wohl aber bei der Installation zur Einrichtung verwendet werden.
| Hinweis Im Projektordner der Anwendung befindet sich bei Windows-Anwendungen die Symboldatei App.ico. Diese dient als Symbol, wenn im Windows-Explorer die Ansicht Große Symbole ausgewählt ist. |
Eine besondere Bedeutung kommt dem Cacheordner für globale Assembly zu. Dateien, die Sie diesem Ordner hinzufügen, müssen einen starken Namen haben und werden automatisch im GAC (Global Assembly Cache) eingetragen. Intern wird demnach bei der Installation jede hier eingetragene Datei mit dem gacutil-Tool registriert.
Globale Assemblies, die Sie diesem Ordner hinzufügen, müssen nicht zwangsläufig auch unter Anwendungsordner aufgeführt sein. Verzichten Sie darauf, wird die Assembly nur im GAC eingetragen, kann aber nicht von anderen Anwendungen benutzt werden, denn über Verweise können in der Entwicklungsumgebung nur DLL-Dateien eingebunden werden. Möchten Sie die Dienste auch anderen Anwendungen zur Verfügung stellen, müssen Sie die Assemblierung deswegen zusätzlich in einem anderen Ordner eintragen. Meistens wird das auch der Anwendungsordner oder eines seiner Unterverzeichnisse sein.
| Hinweis Verteilen Sie zusammen mit der globalen Assembly eine Publisher-Richtlinien-Assembly (siehe Abschnitt 27.1.10), muss diese zusätzlich im Cacheordner für globale Assembly angegeben werden. |
Obwohl .NET die Registrierungsdatenbank für eigene Zwecke nicht benutzt, können wir diese weiterhin als zentrale Ablage von Informationen benutzen. Im Abschnitt 15.11 haben Sie gesehen, wie zur Laufzeit einer Anwendung Daten in die Registrierungsdatenbank geschrieben und ausgewertet werden. Der Registrierungs-Editor eines Weitergabeprojekts geht noch einen Schritt weiter, besser gesagt, er eilt einen Schritt voraus.
Möglicherweise wollen Sie bei der Installation einer Anwendung Informationen in die Registrierungsdatenbank schreiben, die auch schon beim ersten Start der Anwendung das Laufzeitverhalten beeinflussen. Beispielsweise könnten Sie alternativ zum oben vorgestellten benutzerdefinierten Attribut BitmapLocationAttribute, das zur Lokalisierung bestimmter Ressourcen dient, in der Registrierungsdatenbank eine Pfadangabe eintragen. Die Möglichkeiten, die sich mit der internen Datenbank von Windows anbieten, sind ausgesprochen vielseitig.
Im Registrierungs-Editor werden die Registrierungsschlüssel angezeigt, die den Standardregistrierungsschlüsseln von Windows entsprechen:
| HKEY_CLASSES_ROOT |
| HKEY_CURRENT_USER |
| HKEY_LOCAL_MACHINE |
| HKEY_USERS |
| Benutzer-/Computer-Hive |
Für die beiden Registrierungsschlüssel HKEY_CURRENT_USER\Software und HKEY_LOCAL_ MACHINE\Software werden außerdem automatisch zusätzliche Schlüssel angezeigt, die der Manufacturer-Eigenschaft des Weitergabeprojekts entsprechen.
Die unter Benutzer-/Computer-Hive eingegebenen Unterschlüssel und Werte werden im Knoten HKEY_CURRENT_USER installiert, wenn ein Benutzer bei der Installation die Option Aktueller Benutzer wählt. Wenn ein Benutzer bei der Installation Alle Benutzer auswählt, werden die Angaben im Schlüssel HKEY_USERS eingetragen.
a| Achtung Die Auswahl Aktueller Benutzer beziehungsweise Alle Benutzer erfolgt in dem Dialog bei der Installation, in dem der Benutzer den Installationsordner bestätigt oder neu angibt. |
Einen neuen Unterschlüssel legen Sie über das Kontextmenü des Knotens an, zu dem der Unterschlüssel hinzugefügt werden soll. Auf diese Weise können Sie eine beliebig tiefe Gliederungsstruktur schon beim ersten Start der Anwendung gewährleisten. Soll zu einem Schlüssel ein Wert definiert werden, müssen Sie zuerst den Datentyp festlegen. Es kann sich dabei um eine Zeichenfolge, einen Umgebungs-Zeichenfolgewert, einen Binärwert oder einen DWORD-Wert handeln. Anschließend wird dem Wert ein passender Name zugewiesen. Das kann sowohl im rechten Teilfenster des Registrierungs-Editors erfolgen als auch im Eigenschaftsfenster unter Value.
In der Abbildung 27.16 ist im Registrierungs-Editor ein Schlüssel eingetragen, der TestKey heißt. Der Wert ist vom Typ string und beschreibt eine zugewiesene Zeichenfolge, die zumindest einmal nach der Installation angezeigt werden soll.
| Hinweis Für jeden Registrierungswert kann man einen Standardwert festlegen, allerdings darf es für jeden Schlüssel nur ein Standardwert sein. Um einen Standardwert festzulegen, markieren Sie den entsprechenden Wert, öffnen das Kontextmenü und klicken auf Umbenennen. Danach löschen Sie den Namen und bestätigen sofort mit der Eingabetaste. Der ursprüngliche Bezeichner wird dann durch (Standard) ersetzt. |

Hier klicken, um das Bild zu vergrößern
Abbildung 27.16 Der Registrierungs-Editor mit einem zusätzlichen Schlüssel
Mit der Eigenschaft DeleteAtUninstall kann das Verhalten eines Schlüssels einschließlich aller seiner Unterschlüssel bei der Deinstallation einer Anwendung beschrieben werden. Mit true wird der Schlüssel aus der Registrierung gelöscht, mit false, der Standardeinstellung, soll das nicht der Fall sein. Allerdings haben Versuche gezeigt, dass es keinen Unterschied zwischen der Einstellung true und false gibt, da die Schlüsseleinträge einer Anwendung nach der Deinstallation grundsätzlich immer gelöscht werden.
Wenn Sie im Windows-Explorer auf eine Dokumentendatei mit der Erweiterung .DOC doppelklicken, öffnet sich automatisch MS –Word, und das Dokument wird angezeigt. Ursache ist die Verknüpfung des Dateityps mit der Anwendung. Mit dem Dateityp-Editor können Sie dieses Verhalten nach der Installation einer Anwendung erreichen. Wählen Sie dazu im Projektmappen-Explorer des Weitergabeprojekts die vierte Schaltfläche von links in der Symbolleiste.
Im Arbeitsbereich der Entwicklungsumgebung öffnet sich ein neues Fenster, das im Gegensatz zu den beiden vorher besprochenen nur einen Anzeigebereich mit dem Knoten Dateitypen auf dem Zielcomputer aufweist. Über dessen Kontextmenü können Sie einen oder mehrere Dateitypen hinzufügen. Diese Dateitypen werden bei der Installation mit der Anwendung verknüpft, so dass bestimmte Aktionen, beispielsweise das Öffnen mit einem Doppelklick, automatisch erfolgen. Ist ein neuer Datentyp hinzugefügt, erscheint im Dateityp-Editor ein untergeordneter Knoten, dem Sie einen passenderen Namen geben sollten. Ferner ist mit &Open dem Knoten sofort eine Aktion zugeordnet.
Der Knoten eines zu verknüpfenden Dateityps weist mehrere Eigenschaften auf, die wir uns nun zuerst im Überblick ansehen wollen.
| Eigenschaft | Beschreibung |
| Command | Diese Eigenschaft gibt die ausführbare Datei an, die beim Ausführen einer Aktion mit diesem Dateityp gestartet wird. |
| Description | Der Inhalt dieser Eigenschaft wird im Windows Explorer in der Detailansicht in der Spalte Typ angezeigt. |
| Extensions | In dieser Eigenschaft wird der Dateityp ohne vorangestellten Asterisk angegeben, der auf dem Zielrechner registriert werden soll. Mehrere Dateierweiterungen werden durch ein Semikolon getrennt. |
| Icon | Gibt das Symbol an, das für die Dateien dieses Typs angezeigt werden soll. |
| MIME | Gibt einen oder mehrere MIME-Typen (Multipurpose Internet Mail Extension) an, die dem Dateityp auf dem Zielcomputer zugeordnet werden sollen. (Anmerkung: MIME-Typen werden verwendet, um anzugeben, wie Client-Webbrowser und E-Mail-Anwendungen binäre Daten verarbeiten.) |
| Name | Gibt den im Dateityp-Editor verwendeten Namen an. |
Nachdem Sie der Eigenschaft Extensions eine oder auch mehrere Dateierweiterungen zugeordnet haben, sollten diese Dateitypen mit der Anwendung verknüpft werden, die für die Aktionen mit den Dateien verantwortlich ist. Markieren Sie dazu die Eigenschaft Command und klicken auf die Schaltfläche in der Wertespalte des Eigenschaftsfensters. Im sich daraufhin öffnenden Dialog werden alle Knoten des Dateisystem-Editors aufgelistet. Sie müssen nur noch die Datei auswählen, die bei den Aktionen mit diesem Dateityp ausgeführt werden soll. Meistens wird es eine EXE-Datei sein, die unter Anwendungsordner zu finden ist.
Schicker und auch professioneller sieht es aus, wenn der Dateityp im Windows Explorer ein individuelles Symbol anzeigt. Die dazugehörige ICO-Datei muss ebenfalls dem Weitergabeprojekt im Dateisystem-Editor hinzugefügt worden sein. Klicken Sie bei markierter Icon-Eigenschaft auf die Pfeilschaltfläche und wählen dann Durchsuchen, öffnet sich ein Dialogfenster, in dem Sie zu der Symboldatei navigieren können. Zuletzt tragen Sie unter Description noch eine Zeichenfolge ein, die in der Detailansicht des Windows Explorers den Benutzern eine informative Beschreibung des Dateityps anzeigt.
Unter jedem neuen Dateitypeintrag wird mit &Open sofort eine Aktion beschrieben. An der Fettschrift lässt sich erkennen, dass es sich dabei um die Standardaktion handelt, die mit einem Doppelklick auf eine Datei ausgelöst wird.
| Bei der Standardaktion handelt es sich um die Aktion, die sich an oberster Position eines Dateitypknotens befindet. Haben Sie noch weitere Aktionen hinzugefügt und wollen eine davon zur Standardaktion erklären, muss diese nur mittels Drag & Drop auf die oberste Position gezogen werden. |
Eine andere typische Aktion ist das Drucken eines Dokuments. Wird im Windows Explorer das Kontextmenü einer markierten Datei geöffnet, werden die für den Dateityp spezifizierten Aktionen als Menüelemente angezeigt. Der Inhalt der Name-Eigenschaft einer im Dateityp-Editor definierten Aktion dient als Befehl für das Kontextmenü. Daher sollten Sie die Standardvorgabe von &Open in &Öffnen ändern – zumindest wenn Sie eine deutschsprachige Anwendung ausliefern wollen. Das kaufmännische Und-Zeichen (&) vor einem Buchstaben kennzeichnet auch hier nur ein Tastenkürzel für den schnelleren Zugriff.
Über das Kontextmenü einer Datei können die festgelegten Aktionen ausgeführt werden. Angenommen, es würde sich dabei um das Öffnen und das Drucken handeln. Die Wahl einer Aktion führt natürlich nicht sofort dazu, dass die Aktion auch ausgeführt wird. Vielmehr muss dem startenden Programm ein Befehlszeilenargument übermittelt werden, dessen Auswertung erst die gewünschte Operation in die Wege leitet. Das Befehlszeilenargument wird in die Eigenschaft Arguments der Aktion eingetragen.
Entscheidet sich der Benutzer zur Laufzeit für eine bestimmte Aktion, wird der mit der Aktion verbundene Arguments-Eintrag als Befehlszeilenargument an die startende Anwendung übergeben (Sie erinnern sich, die Anwendung wird unter Command eingetragen). Ausgewertet werden muss das übergebene Argument in der Main-Methode, die normalerweise parameterlos ist, aber auch ein Zeichenfolgearray entgegennehmen kann. Das Befehlszeilenargument dient zur Identifizierung der ausgewählten Aktion. Das reicht allerdings noch nicht aus, denn der startenden Anwendung muss auch noch mitgeteilt werden, welche Datei den Start der Anwendung verursacht hat.
Damit könnte die Arguments-Eigenschaft der Aktion Öffnen beispielsweise wie folgt aussehen:
| "%1" OpenDocument |
Für die zweite Aktion, das Drucken des Dateiinhalts, könnte Arguments die folgende Zeichenfolge enthalten:
| "%1" PrintDocument |
Das Argument »&1« stellt die Datei einschließlich der Pfadangabe im ersten Befehlszeilenargument zur Verfügung. Die durch ein Leerzeichen getrennte, sich anschließende Zeichenfolge OpenDocument bzw. PrintDocument wird von der Anwendung zur Identifizierung der auslösenden Aktion herangezogen. Es steht Ihnen natürlich auch frei, noch weitere Argumente zu definieren.
In der Abbildung 28.8 ist der Dateityp-Editor zu sehen, wie er sich nach dem Eintragen der beiden Aktionen Öffnen und Drucken darstellt.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.17 Der Dateityp-Editor
Das folgende Codefragment zeigt eine Main-Methode, die in Abhängigkeit von den übergebenen Argumenten gestartet wird.
| static void Main(string[] args) { |
| if(args.Length == 0) |
| Application.Run(new Form1()); |
| else { |
| string file = args[0]; |
| if(args[1] == "OpenDocument") { |
| // Anweisungen, die das Öffnen des Dokuments bewirken |
| } |
| else if(args[1] == "PrintDocument") { |
| // Anweisungen, die das Drucken des Dokuments bewirken |
| } |
| } |
| } |
| Achtung Im Kontextmenü einer Datei wird auch immer die Option Öffnen mit... angeboten. Es ist weder gelungen, hier den Bezeichner der Anwendung einzutragen, der für den Dateityp registriert ist, noch ist es gelungen, im später aufgerufenen Auswahldialog den Bezeichner und ein spezifisches Symbol anzuzeigen. |
Der Editor, der die meisten Möglichkeiten bietet, ist der Benutzeroberflächen-Editor. Er dient dazu, das Standardinstallationsprogramm um zusätzliche Dialoge zu erweitern, die während der Installation ausgewertet werden. In der folgenden Abbildung ist der Editor abgebildet, wie er sich nach dem Öffnen zeigt. Bemerkenswert ist, dass zwischen einer gewöhnlichen und einer Administratorinstallation unterschieden wird. Dabei beschreibt der Knoten Installation den Installationsprozess eines normalen Endanwenders, der Knoten Administratorinstallation ein Upload des Installationsprogramms aus dem Netzwerk. In diesem Abschnitt werden wir uns nur mit der gewöhnlichen Installation eines einzelnen Benutzers beschäftigen.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.18 Der Benutzeroberflächen-Editor
Jeder der beiden Abschnitte Installieren und Administratorinstallation gliedert sich in die drei Bereiche Starten, Status und Beenden. Jedem Bereich sind bereits Dialoge zugeordnet, deren Aussehen sich – wenn auch in einem geringen Umfang – verändern lässt. Jeder einzelne Abschnitt kann auch noch durch weitere Dialoge ergänzt werden. Sie müssen nicht alle Dialoge der Standardinstallation übernehmen und können sogar im Extremfall eine automatische Installation der Anwendung ohne die Anzeige eines einzigen Dialogs erzwingen. Die Reihenfolge der Anzeige der Dialogfenster bei der Installation entspricht der Reihenfolge im Benutzeroberflächen-Editor von oben nach unten.
Allerdings hat dieser Editor einen nicht unbedeutenden Nachteil: Sie können sich die Dialogfenster nicht anzeigen lassen und erhalten somit auch kein Feedback der resultierenden Änderungen. Ihnen bleibt daher nichts anderes übrig, als auf Verdacht hin mit den Dialogen zu arbeiten und das Ergebnis bei einer Probeinstallation zu begutachten.
Die Standard-Installationsdialoge weisen einige Eigenschaften auf, um die Optik ein wenig zu beeinflussen. Allerdings sind dabei sehr enge Grenzen gesetzt. Verschaffen wir uns zunächst einen Überblick über alle Eigenschaften, die jedoch nicht von allen Dialogen gleichermaßen veröffentlicht werden.
| Eigenschaft | Beschreibung |
| BannerBitmap | Gibt die Bitmap- oder JPEG-Grafikdatei an, die im Dialog angezeigt wird. |
| CopyrightWarning | Gibt den Text für einen Copyright-Vermerk im Dialog Willkommen an. |
| ShowProgressBar | Gibt an, ob der Fortschrittsbalken im Dialog Status angezeigt werden soll. |
| UpdateText | Gibt den Text an, der im Dialog Fertig angezeigt werden soll. |
| WelcomeText | Gibt den Text an, der im Dialog Willkommen angezeigt werden soll. |
Per Voreinstellung wird in den Dialogen in einem Bildfeld eine Standardbitmap angezeigt, die rechts zu sehen ist. Mit der Eigenschaft BannerBitmap können Sie die Standardbitmap gegen eine eigene Bitmap (oder alternativ eine JPEG-Grafikdatei) austauschen. Damit diese weder gestaucht noch gestreckt dargestellt wird, sollten sie eine Größe von 500 x 70 Pixel haben. Die Bitmap muss vorher dem Dateisystem-Editor eingefügt werden. Mit Ihrer Bitmap ersetzen Sie aber nicht die Beschriftung, die im gleichen Bereich angezeigt wird. Damit kommt der Bitmap eher die Funktion einer Hintergrundbitmap zu. Es scheint auch keine Möglichkeit zu geben, die Beschriftung durch eine andere zu ersetzen.
Der Dialog Willkommen zeigt einen Text an, der vor Urheberverletzungen warnt:
Warnung: Dieses Programm ist durch US-amerikanische Urheberrechtsgesetze und internationale Urheberrechtsverträge geschützt. Unbefugte Vervielfältigung oder unbefugter Vertrieb dieses Programms oder eines Teils davon wird sowohl straf- als auch zivilrechtlich verfolgt und kann schwere Strafen und Schadenersatzforderungen zur Folge haben.
Sie können diese Vorgabe durch eine eigene ersetzen. Dazu müssen Sie die Eigenschaft CopyrightWarning überschreiben. Darüber hinaus zeigt derselbe Dialog auch einen Begrüßungstext, der durch die Eigenschaft WelcomeText bereitgestellt wird und mit kurzen Worten die Funktion des Installationsprogramms beschreibt:
Der Installer wird Sie durch die zur Installation von [ProductName] erforderlichen Schritte führen.
Wenn Sie wollen, können Sie auch diesen Text durch einen eigenen ersetzen.
Während der Installation wird der Anwender über den Fortschritt des Installationsprozesses durch einen Fortschrittsbalken im Dialog Status informiert. Mit der Eigenschaft ShowProgressBar kann der Balken zwar ausgeschaltet werden, was allerdings nicht empfehlenswert ist.
Der letzte Dialog der Standardinstallation lautet Fertig. Neben der obligatorischen Möglichkeit, eine eigene Bitmap anzuzeigen, wird der in der Eigenschaft UpdateText angegebene Text angezeigt, der den Anwender dazu auffordert, gegebenenfalls das .NET Framework zu aktualisieren.
Prüfen Sie mit Windows Update, ob wichtige Aktualisierungen für .NET Framework zur Verfügung stehen.
Dass Sie auch bei diesem Text Anpassungen vornehmen können, braucht kaum noch erwähnt zu werden.
In jede der drei Gruppen Starten, Status und Beenden können Sie bei Bedarf noch weitere Dialoge einfügen, mit denen sich der Ablauf der Installation steuern lässt. Jeder Dialog darf allerdings nur einmal in einem Weitergabeprojekt verwendet werden. Es wäre auch falsch zu glauben, diese Dialoge wie normale WinForms behandeln zu können. Tatsächlich ist die jeweilige Einflussnahme auf nur wenige Eigenschaften beschränkt.
Verschaffen wir uns zunächst einen Überblick über das Angebot.
| Mit einem Splash-Dialog kann eine Begrüßungsbitmap angezeigt werden. |
| Mit Hilfe des Dialogs Benutzer registrieren kann der Benutzer Registrierungsinformationen durch eine von Ihnen zur Verfügung gestellte ausführbare Datei übermitteln. |
| Im Dialog Kundeninformationen wird der Anwender zur Eingabe seines Namens, des Namens der Firma und optional auch zur Eingabe einer Seriennummer aufgefordert. |
| Das Dialogfeld Lizenzvertrag zeigt einen Lizenzvertrag an, den der Benutzer lesen und bestätigen muss. |
| Ein Dialog zur Anzeige von zusätzlichen Informationen, der dem zuvor angeführten Dialog Lizenzvertrag ähnelt. |
| Es stehen Dialoge zur Verfügung, die es erlauben, zwischen zwei und maximal vier Optionsschaltflächen anzuzeigen. |
| Dialoge mit bis zu vier Kontrollkästchen ermöglichen die Auswahl optionaler Komponenten. Somit können in einem Weitergabeprojekt maximal drei verschiedene Dialoge mit Kontrollkästchen angeboten werden. |
| Insgesamt drei Dialogfenster stehen zur Verfügung, die bis zu maximal vier Textfelder einzeigen können, in die der Anwender Einträge vornehmen kann. |

Hier klicken, um das Bild zu vergrößern
Abbildung 27.19 Hinzufügen von Dialogen zum Weitergabeprojekt
Ähnlich wie beim Starten einer Anwendung kann auch eine Programminstallation mit der Anzeige eines Splash-Fensters eröffnet werden. Bedauerlicherweise weist dieses Fenster jedoch eine Titelleiste auf, die sich nicht ausblenden lässt. Um zum nächsten Dialog zu gelangen, muss der Anwender auf eine Weiter-Schaltfläche klicken.
Fast über den gesamten Clientbereich des Fensters erstreckt sich eine Picturebox zur Aufnahme einer Bitmap oder JPEG-Datei (Eigenschaft SplashBitmap). Die Größe des Bildes sollte eine Abmessung von 480 x 320 Pixel haben, um weder gestreckt noch gestaucht angezeigt zu werden. Die einzige Möglichkeit, die Bildanzeige zu manipulieren, bietet die Eigenschaft Sunken. Mit der Voreinstellung true wird die Grafik innerhalb des Rahmens abgesenkt dargestellt.
Mit Hilfe dieses Dialog, der meist nach der Installation der Anwendung angezeigt wird, kann der Benutzer Registrierungsinformationen durch eine von Ihnen zur Verfügung gestellte ausführbare Datei übermitteln. Diese Datei wird unter der Eigenschaft Executable eingetragen und muss zum Weitergabeprojekt gehören. Sollen der Datei zusätzliche Befehlszeilenargumente übergeben werden, tragen Sie diese in der Eigenschaft Arguments ein. Der Dialog enthält die Schaltfläche Jetzt registrieren, über welche die ausführbare Datei während der Installation gestartet wird.
In der folgenden Abbildung sehen Sie diesen Dialog für ein Weitergabeprojekt, dessen ProductName-Eigenschaft SetupDemo lautet.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.20 Der Dialog »Benutzer registrieren«
Das Dialogfeld Kundeninformationen fordert vom Benutzer die Eingabe seines Namens, seiner Firma und die Eingabe der Seriennummer (siehe Abbildung 27.21).

Hier klicken, um das Bild zu vergrößern
Abbildung 27.21 Der Dialog »Kundeninformationen«
Neben BannerBitmap sind diesem Dialog drei spezielle Eigenschaften eigen, die Sie der folgenden Tabelle entnehmen können.
| Eigenschaft | Beschreibung |
| SerialNumberTemplate | Definiert eine Vorlage, die zur Überprüfung der eingegebenen Seriennummer verwendet wird. |
| ShowOrganization | Legt fest, ob das Feld Organisation angezeigt wird. |
| ShowSerialNumber | Legt fest, ob das Feld Seriennummer angezeigt wird. |
Wird vom Anwender die Angabe einer Seriennummer verlangt, legt die Eigenschaft SerialNumberTemplate die Eingabeschablone fest, an die sich der Anwender halten muss. Abhängig davon, wie die Schablone vorgegeben ist, wird eine unterschiedliche Anzahl von Eingabefeldern angezeigt.
Die Eingabe der Seriennummer wird von einem internen Algorithmus des Windows Installers überprüft, der bestimmte Zahlen addiert und die resultierende Summe durch sieben dividiert. Bleibt als Divisionsrest null, kann der Anwender die Installation fortsetzen, ansonsten weist ihn ein Meldungsfenster darauf hin, dass die Seriennummer falsch ist. Welche Zahlen vom Überprüfungsalgorithmus erfasst werden, legt die Schablone der Eigenschaft SerialNumberTemplate fest, für die mehrere Platzhalter, wie in Tabelle 27.10 angegeben, vordefiniert sind.
| Platzhalter | Beschreibung |
| # | Steht für eine Zahl, die nicht vom Überprüfungsalgorithmus erfasst wird. |
| % | Steht für eine Zahl, die vom Überprüfungsalgorithmus erfasst wird. |
| ? | Steht für ein alphanumerisches Zeichen, das nicht vom Überprüfungsalgorithmus erfasst wird. |
| ^ | Erfordert ein Zeichen in Großschreibung oder eine Zahl. Eine Zahl wird vom Überprüfungsalgorithmus nicht erfasst. |
Eingeschlossen werden muss die Schablone in spitzen Klammern.
Sehen wir uns nun an, wie wir mit der Angabe der Seriennummer zumindest weitestgehend das unberechtigte Installieren unserer Anwendung wenn schon nicht vermeiden, aber doch erschweren können.
Angenommen, die Eigenschaft SerialNumberTemplate würde die folgende Einstellung aufweisen:
| <###-%%%%%%%> |
Bei der Installation werden zwei Eingabefelder angezeigt: In das erste muss der Anwender drei Zahlen eingeben, in das zweite sieben. Zwei Eingabefelder werden erzwungen, weil zwischen dem dritten und vierten Platzhalter ein Bindestrich steht.
Nur dann, wenn die Quersumme eine durch sieben teilbare Zahl ergibt, wird die Installation fortgesetzt. Damit wären unter anderem die Zahlenkombinationen 0000000, 0000007, 0000007 oder auch 2002003 zulässig. Das sieht natürlich im ersten Moment noch sehr einfach und durchschaubar aus, aber halten Sie sich vor Augen, dass der Benutzer, selbst wenn er den Überprüfungsalgorithmus kennen sollte, nicht weiß, welche der insgesamt zehn Zahlen zur Bildung der Quersumme herangezogen werden. Beispielsweise könnte die Schablone auch folgendermaßen definiert sein:
| <#%%-##%#%%#> |
Nun ist es die Summe aus der ersten, vierten, fünften, siebten und zehnten Zahl, die darüber entscheidet, ob die Installation durchgeführt werden kann.
Nur die beiden Platzhalterkombinationen »^« mit »?« und »#« mit »%« werden gemeinsam in einem Eingabefeld angezeigt – es sei denn, mit einem Bindestrich werden separate Eingabefelder erzwungen. Alle anderen Kombinationen führen dazu, dass zwischen den Platzhaltern intern ein Bindestrich gesetzt wird.
Damit haben Sie nun alle Mittel in der Hand, um durch eine genügend komplexe Seriennummer einer unzulässigen Verteilung Ihrer Anwendung entgegenzuwirken.
Dieser Dialog zeigt einen Lizenzvertrag an, den der Benutzer lesen (sollte) und bestätigen muss. Die Weiter-Schaltfläche wird erst dann aktiviert, wenn der Benutzer auf die Optionsschaltfläche Ich stimme zu klickt.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.22 Der Dialog »Lizenzvertrag«
Die Lizenzinformationen müssen in einer RTF-Datei gespeichert sein, die natürlich auch im Dateisystem-Editor hinzugefügt sein muss. Ein RTF-Dokument können Sie beispielsweise mit MS Word erstellen. In der Eigenschaft LicenseFile des Dialogs geben Sie die Datei an. Außer der Eigenschaft BannerBitmap können Sie mit der Eigenschaft Sunken den Inhalt der Lizenzinformationen in einem abgesenkten Rahmen darstellen.
Der Dialog Infodatei gleicht dem im vorhergehenden Abschnitt besprochenen und in Abbildung 27.22 gezeigten Dialog Lizenzvertrag. Eine Abbildung erübrigt sich daher auch. Der einzige Unterschied besteht darin, dass der Anwender nicht gezwungen wird, den Bedingungen des Lizenzvertrages zuzustimmen. Die Weiter-Schaltfläche ist deshalb auch immer aktiviert. Der Inhalt des Anzeigefelds des Dialogs wird wiederum einer RTF-Datei entnommen. Die Eigenschaft, der die Datei zugewiesen wird, lautet bei diesem Dialog allerdings ReadmeFile.
Wollen Sie den Benutzer Auswahloptionen anbieten, müssen Sie der Installationsroutine Dialogfelder mit sich gegenseitig ausschließenden Optionen anbieten. Es stehen insgesamt drei verschiedene Dialoge mit zwei, drei oder vier Auswahlmöglichkeiten zur Verfügung. Jeder Dialog darf einmal zum Weitergabeprojekt hinzugefügt werden. Auf diese Weise könnten Sie beispielsweise dem Anwender die Entscheidung überlassen, ob er eine zusätzliche Anwendung oder Datei installieren möchte oder nicht. Die Wahl des Anwenders wird beim Installationsprozess ausgewertet und berücksichtigt.
In der folgenden Abbildung 27.23 wird exemplarisch der Dialog mit zwei Optionsschaltflächen gezeigt, wie er sich ohne Eigenschaftsänderung präsentiert.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.23 Dialog mit zwei Optionsschaltflächen
Natürlich können Sie, wie bei allen anderen Dialogen, eine anwendungsspezifische Bitmap anzeigen, aber darüber hinaus bietet dieser Dialog mit der Eigenschaft BannerText auch die Einflussnahme auf die über der Bitmap angezeigte Zeichenfolge. Dem Benutzer müssen Sie natürlich auch mitteilen, welche Auswirkungen die Wahl einer der Optionsschaltflächen hat. Den entsprechenden Text tragen Sie im Eigenschaftsfenster in der Eigenschaft BodyText ein.
Jede Optionsschaltfläche wird durch zwei Eigenschaften beschrieben: Label und Value. Genau genommen heißen die beiden Eigenschaften beispielsweise Button1Label und Button1Value, sind also um ein Präfix ergänzt, um innerhalb des Eigenschaftsfensters eine eindeutige Zuordnung zu einer bestimmten Schaltfläche sicherzustellen. Der Einfachheit halber wird aber im Folgenden auf das Präfix verzichtet. Die Eigenschaft Label enthält die Beschriftung der Optionsschaltfläche, Value ist der von der jeweiligen Optionsschaltfläche zurückgelieferte Wert, wenn diese ausgewählt ist.
Die Eigenschaft ButtonProperty ist als der dem Dialog zugeordnete Name zu verstehen. Er lautet bei einem Dialog mit zwei Optionsschaltflächen BUTTON2, bei einem Dialog mit drei Optionsschaltflächen analog BUTTON3. Sie sollten diese Einträge nach Möglichkeit nicht ändern, da bei einer späteren Auswertung sonst möglicherweise Installationsergebnisse vorliegen, die der Anwender nicht gewünscht hat. Der Windows Installer prüft nämlich nicht die Eindeutigkeit. Stellen Sie zum Beispiel die Eigenschaft Value von zwei Optionsschaltflächen auf eins ein, wird das Weitergabeprojekt zwar anstandslos kompiliert, aber eine Fehlermeldung den Installationsprozess unbarmherzig beenden.
Die letzte Eigenschaft ist DefaultValue und weist standardmäßig den Wert eins auf. Damit wird festgelegt, dass die Optionsschaltfläche vorselektiert ist, die in ihrer Eigenschaft Value genau diese Zahl aufweist.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.24 Eigenschaftsfenster des Dialogs mit zwei Optionsschaltflächen
Nun bleibt noch die Frage zu klären, wie der Windows Installer die Auswahl während der Anwendungsinstallation verarbeitet. Dazu weisen viele Elemente des Setup-Projekts eine Condition-Eigenschaft auf, zum Beispiel jede Datei, die im Dateisystem-Editor eingetragen ist. Per Voreinstellung ist diese Eigenschaft leer, was der Installationsprozess dahingehend interpretiert, dass die entsprechende Komponente installiert werden soll. Sollte jedoch eine Bedingung formuliert sein, muss diese zu true ausgewertet werden, andernfalls wird das Element nicht installiert. Elemente, die eine Condition-Eigenschaft bereitstellen, sind Dateien, Ordner, Registrierungseinträge sowie benutzerdefinierte Aktionen und Startbedingungen.
Kommen wir noch einmal zurück zu unserem Ausgangsbeispiel. Angenommen, Sie haben dem Dateisystem-Editor die Datei xyz.exe hinzugefügt, deren Installation von der Wahl des Benutzers abhängig gemacht werden soll. Der Dialog mit den Optionsschaltflächen könnte das in Abbildung 27.23 gezeigte Aussehen haben. Als Vorgabe ist hier die zweite Optionsschaltfläche selektiert, was der Einstellung DefaultValue=2 entspricht (die Value-Eigenschaften sind nicht verändert worden).
Die Eigenschaft Condition der Datei xyz.exe ist im Dateisystem-Editor auf
| BUTTON2=1 |
eingestellt. Entscheidet sich der Anwender zur Installationszeit dafür, die Datei zu installieren, wird die Eigenschaft ButtonProperty, also BUTTON2 abgerufen. Ist der Inhalt eins, ist die obere Optionsschaltfläche ausgewählt, ist der Inhalt zwei, handelt es sich um die untere.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.25 Beispiel eines Dialogs mit Optionsschaltflächen
Die Dialogfelder mit Kontrollkästchen sind denen mit Optionsschaltflächen sehr ähnlich. Sie werden zur Darstellung von bis zu vier Auswahlmöglichkeiten verwendet und geben deren Werte gleichermaßen während der Installation zurück. Insgesamt können in einem Weitergabeprojekt drei dieser Dialoge aufgenommen werden, die als Typ A, B und C bezeichnet werden. Jeder einzelne Typ kann jedoch nur einmal hinzugefügt werden.
Alle drei Dialogfenster sind identisch und können mit den Eigenschaften BannerBitmap, BannerText und BodyText anforderungsgerecht gestaltet beziehungsweise beschriftet werden. Per Vorgabe weisen die Dialoge vier Kontrollkästchen auf. Benötigen Sie weniger, müssen Sie nur die Eigenschaft Visible=false setzen. Jedes Kontrollkästchen weist eine ihm eigene Eigenschaft Label auf, die den Beschreibungstext enthält, und eine Eigenschaft Value, die entweder auf Checked oder Unchecked eingestellt ist. Der Standard ist Unchecked.
Ausgewertet wird der Zustand eines Kontrollkästchens wiederum mit der Eigenschaft Condition. Angenommen, eine Datei soll genau dann installiert werden, wenn im Dialog Kontrollkästchen (A) die oberste Checkbox ausgewählt ist, tragen Sie in der Condition-Eigenschaft der Datei den Inhalt der Eigenschaft CheckBox1Property, die standardmäßig CHECKBOXA1 lautet, ein.
| Hinweis Beachten Sie, dass der Identifizierer des Kontrollkästchendialogs, also A, B oder C, einen Teil des Eigenschaftwerts ausmacht und somit eine Unterscheidungsmöglichkeit zwischen den Kontrollkästchen der drei identischen Dialoge ermöglicht. |
Dialoge mit Textfeldern werden verwendet, um dem Benutzer bis zu maximal vier Möglichkeiten für individuelle Einträge anzubieten. Während der Installation können die Einträge ausgewertet werden. Wie bei den Dialogen mit Kontrollkästchen stehen einem Weitergabeprojekt maximal drei Eingabedialoge zur Verfügung (Typ A, B und C), wobei jeder einzelne nur einmal je Weitergabeprojekt hinzugefügt werden kann. Den gesamten Dialog betreffende Eigenschaften sind BannerBitmap, BannerText und BodyText.
Jedes Eingabefeld wird durch eine Label-, Property- und Value-Eigenschaft beschrieben. Beim ersten, zuoberst angezeigten Eingabefeld im Dialog (A) lauten die Eigenschaften Edit1Label, Edit1Property und Edit1Value. Die Eigenschaft Label enthält den Text, der rechts vom Eingabefeld angezeigt wird, die Value-Eigenschaft gibt den Text im Eingabefeld an. Property gibt den Eigenschaftsnamen an, der ausgewertet werden kann.
Einträge in die Textfelder können beispielsweise dazu benutzt werden, in der Registrierung gespeichert zu werden. Dazu muss die Condition-Eigenschaft des entsprechenden Registrierungseintrags auf den Wert der Property-Eigenschaft gesetzt werden.
Mit diesem Editor lassen sich weitere Aktionen festlegen, die während der Installation auf dem Zielrechner ausgeführt werden sollen. Beispielsweise könnte mit einer benutzerdefinierten Aktion eine Datenbank erzeugt werden. Schlägt die Installation der Anwendung fehl, kann die Datenbank auch wieder gelöscht werden. Benutzerdefinierte Aktionen sind in Dateien programmiert. Dabei kann es sich um EXE-, DLL- oder Skriptdateien handeln.
Der Editor beschreibt vier Bereiche: Installieren, Commit ausführen, Rollback und Deinstallieren. Jedem dieser Bereiche kann über sein Kontextmenü eine benutzerdefinierte Aktion zugeteilt werden – also nichts anderes als eine Datei, die ausgeführt wird und die gewünschte Operation bereitstellt. Die angegebenen Dateien müssen natürlich zum Weitergabeprojekt gehören.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.26 Der »Editor für benutzerdefinierte Aktionen«
Dem Knoten Installieren werden die Aktionen hinzugefügt, die am Ende der Installationsphase ausgeführt werden sollen, also wenn alle anderen Dateien bereits installiert sind. Während der Installation kann es zu Fehlern kommen. Wollen Sie in dieser Situation bestimmte Operationen automatisch ausführen lassen, tragen Sie diese unter dem Knoten Rollback ein. Nach einer erfolgreichen Installation werden alle Aktionen ausgeführt, die unter dem Knoten Commit ausführen eingetragen sind.
Auch an die Deinstallation einer Anwendung wird mit diesem Editor gedacht. Benutzerdefinierte Aktionen im Knoten Deinstallieren werden aufgerufen, wenn eine Anwendung deinstalliert wird.
Ob eine Anwendung überhaupt installiert werden kann beziehungsweise in welchem Umfang eine Installation erfolgt, kann mit diesem Editor festgelegt werden. So können Sie zum Beispiel nach einer bestimmten Datei suchen, nach Registrierungseinträgen oder auch, ob auf dem Zielcomputer das passende .NET Framework installiert ist.
Die Einstellungen im Editor für Startbedingungen werden vor Beginn der Installation überprüft. Das Ergebnis fällt entweder positiv oder negativ aus. In den meisten Fällen muss der Installationsprozess reagieren, wenn die Überprüfung ein negatives Ergebnis liefert. Das Installationsprogramm kann dann zwei Verhaltensweisen zeigen:
1. Die Installation wird mit einer Fehlermeldung abgebrochen.| 2. | Die Installation wird fortgesetzt. Möglicherweise werden dabei auch die Voraussetzungen geschaffen, damit die Anwendung später problemlos ausgeführt werden kann. |
Die Oberfläche des Editors zeigt sich in einem einteiligen Fenster, in dem bereits Knoten vordefiniert sind. Unterhalb des Stammknotens Anforderungen für den Zielcomputer sind mit Zielcomputer durchsuchen und Startbedingungen zwei untergeordnete Knoten eingetragen. Letzterer hat auch schon mit .NET Framework einen Eintrag, der auf dem Zielrechner nach dem .NET Framework sucht. Dieser Eintrag kann nicht gelöscht werden.
Öffnen wir das Kontextmenü des Stammknotens, werden uns drei mögliche Startkonditionen angeboten (siehe Abbildung 27.27).

Hier klicken, um das Bild zu vergrößern
Abbildung 27.27 Der »Editor für Startbedingungen«
Mit einer Dateistartkondition können wir den Zielcomputer nach einer bestimmten Datei durchsuchen, mit einer Registrierungsstartkondition die Registrierung nach einem bestimmten Schlüssel und mit der Windows Installer-Startbedingung den Zielrechner nach einer bestimmten Komponente. Wählen Sie aus dem Kontextmenü eine dieser Bedingung aus, wird der Knoten Zielcomputer durchsuchen um das ausgewählte Element ergänzt.
Elemente, die dem Knoten Zielcomputer durchsuchen untergeordnet sind, definieren die Eigenschaften der Suche. Markieren Sie den Elementeintrag, werden im Eigenschaftsfenster die dem Element zugeordneten Eigenschaften angezeigt. Wird nach einer Datei gesucht, tragen Sie den Namen der Datei unter der Eigenschaft FileName ein, der zu durchsuchende Ordner entspricht der Angabe unter Folder. Wenn es notwendig ist, lassen sich darüber hinaus die Testkriterien durch weitere Eigenschaften noch weiter einschränken. Beispielsweise kann mit MaxSize die maximale Größe in Bytes für eine Datei bei einer Dateisuche auf dem Zielcomputer angegeben werden. Das Ergebnis des Tests wird in eine Variable geschrieben, die der Eigenschaft Property zugeordnet ist. Bei der Suche nach einer Datei ist es die Variable FILEEXISTS1. Sie enthält entweder true oder false.
Damit dürfte die Aufgabe eines Elements im Knoten Zielcomputer durchsuchen klar sein: Es wird einer booleschen Variablen das Testergebnis mitgeteilt. Wie das Ergebnis jedoch ausgewertet wird, steht aber noch auf einem anderen Blatt. Wie am Anfang des Abschnitts bereits erläutert, kann das Ergebnis dazu verwendet werden, den Installationsprozess abzubrechen, oder es wird an anderer Stelle der Installation dazu benutzt, fehlende Komponenten entsprechend einzurichten oder zu installieren.
Ist das Vorhandensein einer Komponente von existenzieller Bedeutung, muss diese installiert oder die Installation beendet werden.
Doch wie wertet man das Ergebnis der Prüfung aus und reagiert entsprechend?
Dazu müssen Sie nur noch unter dem Knoten Startbedingungen einen neuen Eintrag hinzufügen. Das Ergebnis im Dialog Startbedingungen sehen Sie in Abbildung 27.28. Eine Bedingung hat drei Eigenschaften:
| Condition |
| InstallUrl |
| Message |

Hier klicken, um das Bild zu vergrößern
Abbildung 27.28 Dialog »Startbedingungen« mit Eintrag zum Suchen einer Datei
Im Knoten Zielcomputer durchsuchen können durchaus auch mehrere Einträge gemacht worden sein, die Voraussetzung des einwandfreien Laufzeitverhaltens der Anwendung sind. Daher muss zuerst ein Bezug zwischen dem Eintrag unter Zielcomputer durchsuchen und der hinzugefügten Bedingung hergestellt werden. Diesen Bezug stellt die Eigenschaft Condition her. In der Wertespalte im Eigenschaftsfenster muss dazu aus einer Auswahlliste die zugehörige Property ausgewählt werden (beispielsweise FILEEXISTS1). Ist der Wert der Variablen false, wird ein Meldungsfenster angezeigt, dessen Meldungstext Sie in der Eigenschaft Message festlegen. Damit der Anwender nicht im Stich gelassen wird und weiß, woher er die fehlende Datei beziehen kann, sollten Sie unter der Eigenschaft InstallUrl einen Speicherort angeben, von dem der Benutzer die Datei laden kann. Bei dem Speicherort kann es sich um eine Internetadresse, aber auch um einen Dateipfad handeln, der relativ zum Speicherort des Installationsprogramms angegeben werden muss. Weist InstallUrl einen Eintrag auf, hat der Anwender die Wahl, entweder zu der angegebenen Adresse zu navigieren oder die Installation sofort abbrechen.

Hier klicken, um das Bild zu vergrößern
Abbildung 27.29 Fehlermeldung, wenn die Suche nach einer Datei auf dem Ziellrechner negativ verläuft
Wenn Sie im Voraus wissen, dass Sie die Programminstallation nicht abbrechen wollen, wenn die Datei auf dem Zielrechner nicht installiert ist, können Sie eine Dateisuche auch ohne zusätzliche Bedingung einrichten, wenn Sie die Dateisuche über das Kontextmenü des Knotens Zielcomputer durchsuchen hinzufügen.
Nehmen wir jetzt an, dass die Programminstallation nicht abgebrochen werden soll, der Installationsprozess das Ergebnis der Suche aber dahingehend auswertet, dass die Datei bei der Programminstallation auf dem Zielrechner automatisch installiert wird. Um das zu realisieren, muss die Datei dem Dateisystem-Editor hinzugefügt worden sein. Der Eigenschaft Condition der Datei teilen Sie nur noch die Bedingung mit, wann die Datei zu installieren ist. Dazu wird auch wieder die Variable FILEEXISTS1 ausgewertet:
| Condition = NOT FILEEXISTS1 |
Eine Aktion wird immer dann ausgeführt, wenn die Eigenschaft Condition wahr ist, also true liefert. Da FILEEXISTS1 false ist, wenn die Datei sich nicht auf dem Zielrechner befindet, müssen Sie den Inhalt der Variablen FILEEXISTS1 negieren.
| Hinweis Zur Formulierung einer vom Windows Installer auszuwertenden Bedingung stehen neben NOT noch weitere Operatoren zur Verfügung. Beispielsweise können Sie mit den booleschen Operatoren AND und OR zwei Ausdrücke gemeinsam auswerten oder mit Vergleichsoperatoren zwei Ausdrücke miteinander vergleichen. Mehr Informationen darüber erhalten Sie in der Online-Dokumentation des Windows Installers. |
Nun wollen wir uns auch noch ansehen, wie nach einem bestimmten Eintrag in der Registrierungsdatenbank gesucht wird. Dazu bedienen wir uns eines konkreten Beispiels, mit dem Sie in der Praxis häufig konfrontiert werden.
Sehr viele Anwendungen greifen auf Daten zu, die in einer Datenbank gespeichert sind. Programme mit Datenzugriff sind aber darauf angewiesen, dass auf dem Computer eine Version 2.7 oder höher von Microsoft Data Access Components (MDAC) installiert ist. Diese Komponentensoftware ist unter dem Stammschlüssel HKEY_LOCAL_MACHINE und dort unter SOFTWARE/Microsoft/DataAccess eingetragen.
Damit eine Anwendung mit Datenbankzugriff ordnungsgemäß funktioniert, muss überprüft werden, ob MDAC 2.7 oder höher auf dem Zielrechner installiert ist. Die Bedingung wird im Editor für Startbedingungen formuliert, indem unter dem Knoten Anforderungen für den Zielcomputer eine Registrierungsstartkondition hinzugefügt wird. Im Knoten erscheint daraufhin ein Element, das mit Nach RegistryEntry1 suchen bezeichnet ist.
Elemente, die nach einem Eintrag in der Registry suchen, weisen neben Name noch vier weitere Eigenschaften auf:
| Property |
| RegKey |
| Root |
| Value |
In der Eigenschaft Root wird der Registrierungsstamm eingetragen. Im Eigenschaftsfenster wird Ihnen dazu eine Liste mit vier Konstanten eingeblendet, aus der Sie die gewünschte auswählen müssen. Wollen Sie HKEY_LOCAL_MACHINE durchsuchen, lautet die entsprechende Konstante vsdrrHKLM. Unter RegKey tragen Sie den gesuchten Registrierungsschlüssel ein. In unserem Beispiel wäre das Software\Microsoft\DataAccess.
Die Eigenschaft Value beschreibt den zu suchenden Registrierungswert. Wenn Sie die Registrierungsdatenbank mit regedit.exe öffnen, werden Sie unter dem vorgenannten Registrierungsschlüssel mehrere Einträge finden. Derjenige, der für uns von Bedeutung ist, weil er die gesuchte Versionsnummer der auf dem Zielrechner installierten MDAC-Komponente enthält, lautet FullInstallVer.
Unter Property hat der Editor bereits eine Variable eingetragen, der das Ergebnis der Suche zugewiesen wird. Standardmäßig lautet er für die erste Registrierungssuche REGISTRYVALUE1.
Nun gilt es noch, das Suchergebnis auszuwerten. Dazu muss nur eine entsprechende Bedingung unter dem Knot